home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPAFP.SA < prev    next >
Text File  |  1989-08-30  |  12KB  |  258 lines

  1.        TTL     FAST FLOATING POINT ASCII TO FLOAT (FFPAFP)
  2. ************************************
  3. * (C) COPYRIGHT 1980 MOTORLA INC.  *
  4. ************************************
  5.  
  6. ***********************************************************
  7. *                        FFPAFP                           *
  8. *                    ASCII TO FLOAT                       *
  9. *                                                         *
  10. *      INPUT:  A0 - POINTER TO ASCII STRING OF A FORMAT   *
  11. *                   DESCRIBED BELOW                       *
  12. *                                                         *
  13. *      OUTPUT: D7 - FAST FLOATING POINT EQUIVALENT        *
  14. *              A0 - POINTS TO THE CHARACTER WHICH         *
  15. *                   TERMINATED THE SCAN                   *
  16. *                                                         *
  17. *      CONDITION CODES:                                   *
  18. *                N - SET IF RESULT IS NEGATIVE            *
  19. *                Z - SET IF RESULT IS ZERO                *
  20. *                V - SET IF RESULT OVERFLOWED             *
  21. *                C - SET IF INVALID FORMAT DETECTED       *
  22. *                X - UNDEFINED                            *
  23. *                                                         *
  24. *      REGISTERS D3 THRU D6 ARE VOLATILE                  *
  25. *                                                         *
  26. *      CODE SIZE: 246 BYTES     STACK WORK: 8 BYTES       *
  27. *                                                         *
  28. *      INPUT FORMAT:                                      *
  29. *                                                         *
  30. *     {SIGN}{DIGITS}{'.'}{DIGITS}{'E'}{SIGN}{DIGITS}      *
  31. *     <*********MANTISSA********><*****EXPONENT****>      *
  32. *                                                         *
  33. *                   SYNTAX RULES                          *
  34. *          BOTH SIGNS ARE OPTIONAL AND ARE '+' OR '-'.    *
  35. *          THE MANTISSA MUST BE PRESENT.                  *
  36. *          THE EXPONENT NEED NOT BE PRESENT.              *
  37. *          THE MANTISSA MAY LEAD WITH A DECIMAL POINT.    *
  38. *          THE MANTISSA NEED NOT HAVE A DECIMAL POINT.    *
  39. *                                                         *
  40. *      EXAMPLES:  ALL OF THESE VALUES REPRESENT THE       *
  41. *                 NUMBER ONE-HUNDRED-TWENTY.              *
  42. *                                                         *
  43. *                       120            .120E3             *
  44. *                       120.          +.120E+03           *
  45. *                      +120.          0.000120E6          *
  46. *                   0000120.00  1200000E-4                *
  47. *                               1200000.00E-0004          *
  48. *                                                         *
  49. *      FLOATING POINT RANGE:                              *
  50. *                                                         *
  51. *          FAST FLOATING POINT SUPPORTS THE VALUE ZERO    *
  52. *          AND NON-ZERO VALUES WITHIN THE FOLLOWING       *
  53. *          BOUNDS -                                       *
  54. *                                                         *
  55. *                   18                             -20    *
  56. *    9.22337177 X 10   > +NUMBER >  5.42101070 X 10       *
  57. *                                                         *
  58. *                   18                             -20    *
  59. *   -9.22337177 X 10   > -NUMBER > -2.71050535 X 10       *
  60. *                                                         *
  61. *      PRECISION:                                         *
  62. *                                                         *
  63. *          THIS CONVERSION RESULTS IN A 24 BIT PRECISION  *
  64. *          WITH GUARANTEED ERROR LESS THAN OR EQUAL TO    *
  65. *          ONE-HALF LEAST SIGNIFICANT BIT.                *
  66. *                                                         *
  67. *                                                         *
  68. *      NOTES:                                             *
  69. *          1) THIS ROUTINE CALLS THE DUAL-BINARY TO FLOAT *
  70. *             ROUTINE AND CAN BE USED AS AN ILLUSTRATION  *
  71. *             OF HOW TO 'FRONT-END' THAT ROUTINE WITH     *
  72. *             A CUSTOMIZED SCANNER.                       *
  73. *          2) UNDERFLOWS RETURN A ZERO WITHOUT ANY        *
  74. *             INDICATORS SET.                             *
  75. *          3) OVERFLOWS WILL RETURN THE MAXIMUM VALUE     *
  76. *             POSSIBLE WITH PROPER SIGN AND THE 'V' BIT   *
  77. *             SET IN THE CCR.                             *
  78. *          4) IF THE 'C' BIT IN THE CCR INDICATES AN      *
  79. *             INVALID PATTERN DETECTED, THEN A0 WILL      *
  80. *             POINT TO THE INVALID CHARACTER.             *
  81. *                                                         *
  82. *      LOGIC SUMMARY:                                     *
  83. *                                                         *
  84. *          A) PROCESS LEADING SIGN                        *
  85. *          B) PROCESS PRE-DECIMALPOINT DIGITS AND         *
  86. *             INCREMENT 10 POWER BIAS FOR EACH            *
  87. *             DIGIT BYPASSED DUE TO 32 BIT OVERFLOW       *
  88. *          C) PROCESS POST-DECIMALPOINT DIGITS            *
  89. *             DECREMENTING THE 10 POWER BIAS FOR EACH     *
  90. *          D) PROCESS THE EXPONENT                        *
  91. *          E) ADD THE 10 POWER BIAS TO THE EXPONENT       *
  92. *          F) CALL 'FFPDBF' ROUTINE TO FINISH CONVERSION  *
  93. *                                                         *
  94. *   TIMES: (8 MHZ NO WAIT STATES)                         *
  95. *          374 MICROSECONDS CONVERTING THE STRING         *
  96. *                                                         *
  97. *                                                         *
  98. ***********************************************************
  99.          PAGE
  100. FFPAFP IDNT    1,1  FFP ASCII TO FLOAT
  101.  
  102.          OPT       PCS
  103.  
  104.       XDEF    FFPAFP    ENTRY POINT
  105.  
  106.       XREF     9:FFPDBF,FFPCPYRT
  107.  
  108.          SECTION    9
  109.  
  110. FFPAFP   MOVE.L    #0,D7     CLEAR MANTISSA BUILD
  111.          MOVE.L    #0,D6     CLEAR SIGN+BASE10 BUILD
  112.  
  113. * CHECK FOR LEADING SIGN
  114.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  115.          BEQ.S     FPANMB    BRANCH DIGIT FOUND
  116.          BCS.S     FPANOS    BRANCH NO SIGN ENCOUNTERED
  117.  
  118. * LEADING SIGN ENCOUNTERED
  119.          CMP.B     #'-',D5   COMPARE FOR MINUS
  120.          SEQ.B     D6        SET ONES IF SO
  121.          SWAP.W    D6        SIGN TO HIGH WORD IN D6
  122.  
  123. * TEST FOR DIGIT OR PERIOD
  124.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  125.          BEQ.S     FPANMB    BRANCH DIGIT TO BUILD MANTISSA
  126. FPANOS   CMP.B     #'.',D5   ? LEADING DECIMALPOINT
  127.          BNE.S     FPABAD    BRANCH INVALID PATTERN IF NOT
  128.  
  129. * INSURE AT LEAST ONE DIGIT
  130.          BSR       FPANXT    OBTAIN NEXT CHARACTER
  131.          BEQ.S     FPADOF    BRANCH IF FRACTION DIGIT
  132.  
  133. * INVALID PATTERN DETECTED
  134. FPABAD   SUB.L     #1,A0 POINT TO INVALID CHARACTER
  135. *        OR.W      #$00001,CCR FORCE CARRY BIT ON
  136.          DC.L      $003C0001 ****ASSEMBLER ERROR*****
  137.          RTS                 RETURN TO CALLER
  138.  
  139. * PRE-DECIMALPOINT MANTISSA BUILD
  140. FPANXD   BSR       FPANXT    NEXT CHARACTER
  141.          BNE.S     FPANOD    BRANCH NOT A DIGIT
  142. FPANMB   BSR.S     FPAX10    MULTIPLY TIMES TEN
  143.          BCC.S     FPANXD    LOOP FOR MORE DIGITS
  144.  
  145. * PRE-DECIMALPOINT MANTISSA OVERFLOW, COUNT TILL END OR DECIMAL REACHED
  146. FPAMOV   ADD.W     #1,D6     INCREMENT TEN POWER BY ONE
  147.          BSR.S     FPANXT    OBTAIN NEXT PATTERN
  148.          BEQ.S     FPAMOV    LOOP UNTIL NON-DIGIT
  149.          CMP.B     #'.',D5   ? DECIMAL POINT REACHED
  150.          BNE.S     FPATSE    NO, NO CHECK FOR EXPONENT
  151.  
  152. * FLUSH REMAINING FRACTIONAL DIGITS
  153. FPASRD   BSR.S     FPANXT    NEXT CHARACTER
  154.          BEQ.S     FPASRD    IGNORE IT IF STILL DIGIT
  155. FPATSE   CMP.B     #'E',D5   ? EXPONENT HERE
  156.          BNE.S     FPACNV    NO, FINISHED - GO CONVERT
  157.  
  158. * NOW PROCESS THE EXPONENT
  159.          BSR.S     FPANXT    OBTAIN FIRST DIGIT
  160.          BEQ.S     FPANTE    BRANCH GOT IT
  161.          BCS.S     FPABAD    BRANCH INVALID FORMAT, NO SIGN OR DIGITS
  162.          ROL.L     #8,D6     HIGH BYTE OF D6 INTO LOW
  163.          CMP.B     #'-',D5   ? MINUS SIGN
  164.          SEQ.B     D6        SET ONES OR ZERO
  165.          ROR.L     #8,D6     D6 HIGH BYTE IS EXPONENTS SIGN
  166.          BSR.S     FPANXT    NOW TO FIRST DIGIT
  167.          BNE.S     FPABAD    BRANCH INVALID - DIGIT EXPECTED
  168.  
  169. * PROCESS EXPONENT'S DIGITS
  170. FPANTE   MOVE.W    D5,D4     COPY DIGIT JUST LOADED
  171. FPANXE   BSR.S     FPANXT    EXAMINE NEXT CHARACTER
  172.          BNE.S     FPAFNE    BRANCH END OF EXPONENT
  173.          MULU.W    #10,D4    PREVIOUS VALUE TIMES TEN
  174.          CMP.W     #2000,D4  ? TOO LARGE
  175.          BHI.S     FPABAD    BRANCH EXPONENT WAY OFF BASE
  176.          ADD.W     D5,D4     ADD LATEST DIGIT
  177.          BRA.S     FPANXE    LOOP FOR NEXT CHARACTER
  178.  
  179. * ADJUST FOR SIGN AND ADD TO ORIGINAL INDEX
  180. FPAFNE   TST.L     D6        ? WAS EXPONENT NEGATIVE
  181.          BPL.S     FPAADP    BRANCH IF SO
  182.          NEG.W     D4        CONVERT TO NEGATIVE VALUE
  183. FPAADP   ADD.W     D4,D6     FINAL RESULT
  184. FPACNV   SUB.L     #1,A0 POINT TO TERMINATION CHARACTER
  185.          BRA       FFPDBF    NOW CONVERT TO FLOAT
  186.  
  187. * PRE-DECIMALPOINT NON-DIGIT ENCOUNTERED
  188. FPANOD   CMP.B     #'.',D5   ? DECIMAL POINT HERE
  189.          BNE.S     FPATSE    NOPE, TRY FOR THE 'E'
  190.  
  191. * POST-DECIMALPOINT PROCESSING
  192. FPADPN   BSR.S     FPANXT    OBTAIN NEXT CHARACTER
  193.          BNE.S     FPATSE    NOT A DIGIT, TEST FOR 'E'
  194. FPADOF   BSR.S     FPAX10    TIMES TEN PREVIOUS VALUE
  195.          BCS.S     FPASRD    FLUSH IF OVERFLOW NOW
  196.          SUB.W     #1,D6     ADJUST 10 POWER BIAS
  197.          BRA.S     FPADPN    AND TO NEXT CHARACTER
  198.  
  199. *   *
  200. *   * FPAX10 SUBROUTINE - PROCESS NEXT DIGIT
  201. *   *  OUTPUT: C=0 NO OVERFLOW, C=1 OVERFLOW (D7 UNALTERED)
  202. *   *
  203. FPAX10   MOVE.L    D7,D3     COPY VALUE
  204.          LSL.L     #1,D3     TIMES TWO
  205.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  206.          LSL.L     #1,D3     TIMES FOUR
  207.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  208.          LSL.L     #1,D3     TIMES EIGHT
  209.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  210.          ADD.L     D7,D3     ADD ONE TO MAKE X 9
  211.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  212.          ADD.L     D7,D3     ADD ONE TO MAKE X 10
  213.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  214.          ADD.L     D5,D3     ADD NEW UNITS DIGIT
  215.          BCS.S     FPAXRT    RETURN IF OVERFLOW
  216.          MOVE.L    D3,D7     UPDATE RESULT
  217. FPAXRT   RTS                 RETURN TO CALLER
  218.  
  219.  
  220. *
  221. * FPANXT SUBROUTINE - RETURN NEXT INPUT PATTERN
  222. *
  223. *    INPUT:  A0
  224. *
  225. *    OUTPUT:  A0 INCREMENTED BY ONE
  226. *             IF Z=1 THEN DIGIT ENCOUNTERED AND D5.L SET TO BINARY VALUE
  227. *             IF Z=0 THEN D6.B SET TO CHARACTER ENCOUNTERED
  228. *                         AND C=0 IF PLUS OR MINUS SIGN
  229. *                             C=1 IF NOT PLUS OR MINUS SIGN
  230. *
  231.  
  232. FPANXT   MOVEQ     #0,D5     ZERO RETURN REGISTER
  233.          MOVE.B    (A0)+,D5  LOAD CHARACTER
  234.          CMP.B     #'+',D5   ? PLUS SIGN
  235.          BEQ.S     FPASGN    BRANCH IF SIGN
  236.          CMP.B     #'-',D5   ? MINUS SIGN
  237.          BEQ.S     FPASGN    BRANCH IF SIGN
  238.          CMP.B     #'0',D5   ? LOWER THAN A DIGIT
  239.          BCS.S     FPAOTR    BRANCH IF NON-SIGNDIGIT
  240.          CMP.B     #'9',D5   ? HIGHER THAN A DIGIT
  241.          BHI.S     FPAOTR    BRANCH IF NON-SIGNDIGIT
  242. * IT IS A DIGIT
  243.          AND.B     #$0F,D5   TO BINARY
  244. *        MOVE.W    #$0004,CCR SET Z=1 FOR DIGIT
  245.          DC.L      $44FC0004 ***ASSEMBLER ERROR***
  246.          RTS                 RETURN TO CALLER
  247. * IT IS A SIGN
  248. *FPASGN   MOVE.W    #$0000,CCR SET Z=0 AND C=0
  249. FPASGN   DC.L      $44FC0000 ***ASSEMBLER ERROR***
  250.          RTS                 RETURN TO CALLER
  251. * IT IS NEITHER SIGN NOR DIGIT
  252. *FPAOTR   MOVE.W    #$0001,CCR SET Z=0 AND C=1
  253. FPAOTR   DC.L      $44FC0001 ***ASSEMBLER ERROR***
  254.          RTS       RETURN TO CALLER
  255.  
  256.          END
  257.  
  258.